package dominio;

import exceptions.ErrorTerreno;

import org.junit.Before;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class FilaTest extends junit.framework.TestCase {
	private Fila filaTerrestre, filaAcuatica;
	private Planta plantaTerrestre, plantaAcuatica, plantaCarnada;

	@Before
	public void setUp() throws Exception {

		filaTerrestre = new Fila(5, true);
		filaAcuatica = new Fila(5, false);
		
		// Planta terrestre con 10 puntos de ataque
		plantaTerrestre = mock(Planta.class);
		when(plantaTerrestre.getTerrestre()).thenReturn(true);
		when(plantaTerrestre.getPuntosAtaque()).thenReturn(10);
		
		// Planta acuatica
		plantaAcuatica = mock(Planta.class);
		when(plantaAcuatica.getTerrestre()).thenReturn(false);
		
		// Planta terrestre con 20 puntos de ataque
		plantaCarnada = mock(Planta.class);
		when(plantaCarnada.getTerrestre()).thenReturn(true);
		when(plantaCarnada.getPuntosAtaque()).thenReturn(20);
	}

	@Test
	public void testPlantarTerrestreEnLugarIncorrecto() {
		
		try {
			filaAcuatica.addPlanta(2, plantaTerrestre);
			fail("No tira exception ErrorDeTerreno");
		} catch(ErrorTerreno e) {
		}
	}

	@Test
	public void testPlantarTerrestreEnLugarCorrecto() {
		
		try {
			filaTerrestre.addPlanta(2, plantaTerrestre);
		} catch(ErrorTerreno e) {
			fail("No tira exception ErrorDeTerreno");
		}
	}
	
	@Test
	public void testPlantarAcuaticaEnLugarIncorrecto() {
		
		try {
			filaTerrestre.addPlanta(2, plantaAcuatica);
			fail("No tira exception ErrorDeTerreno");
		} catch(ErrorTerreno e) {
		}
	}

	@Test
	public void testPlantarAcuaticaEnLugarCorrecto() {
		
		try {
			filaAcuatica.addPlanta(2, plantaAcuatica);
		} catch(ErrorTerreno e) {
			fail("No tira exception ErrorDeTerreno");
		}
	}
	
	@Test
	public void testObtenerPrimeraPlantaAtacableWHENHayUnaPlanta() {
		// Este metodo planta un clon
		//filaTerrestre.addPlanta(1, plantaTerrestre);
		filaTerrestre.getCasilleros().get(1).setPlanta(plantaTerrestre);
		assertEquals(plantaTerrestre, filaTerrestre.obtenerPrimeraPlantaAtacable());
	}
	
	@Test
	public void testObtenerPrimeraPlantaAtacableWHENHayMasDeUnaPlanta() {
		filaTerrestre.getCasilleros().get(0).setPlanta(plantaTerrestre);
		filaTerrestre.getCasilleros().get(2).setPlanta(plantaCarnada);
		
		// Debe devolver la planta que esta mas a la derecha
		assertEquals(plantaCarnada, filaTerrestre.obtenerPrimeraPlantaAtacable());
	}
	
	@Test
	public void testPuntosAtaquePlantasWHENFilaVacia() {
		assertEquals(filaTerrestre.puntosAtaquePlantas(), 0);
	}
	
	@Test
	public void testPuntosAtaquePlantasWHENHayUnaPlanta() {
		
		filaTerrestre.getCasilleros().get(0).setPlanta(plantaTerrestre);
		
		assertEquals(filaTerrestre.puntosAtaquePlantas(), 10);
	}
	
	@Test
	public void testPuntosAtaquePlantasWHENHayVariasPlantas() {
		
		filaTerrestre.getCasilleros().get(0).setPlanta(plantaTerrestre);
		filaTerrestre.getCasilleros().get(1).setPlanta(plantaCarnada);
		
		assertEquals(filaTerrestre.puntosAtaquePlantas(), 30);
	}
	
	@Test
	public void testHayPlantasWHENnoHayPlantas() {
		assertFalse(filaTerrestre.hayPlantas());
	}
	
	@Test
	public void testHayPlantasWHENhayAlMenosUnaPlanta() {
		filaTerrestre.getCasilleros().get(0).setPlanta(plantaTerrestre);
		assertTrue(filaTerrestre.hayPlantas());
	}
}
